package com.edu.exam.entity.quality.audit;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 质量评估实体类
 *
 * <p>质量评估实体用于管理试卷质量评估的完整流程，包括评估配置、执行过程、
 * 结果记录等。支持多维度质量评估和综合评分。</p>
 *
 * <p>核心功能：
 * - 评估管理：管理质量评估的创建、执行、完成等生命周期
 * - 多维评估：支持从多个维度进行质量评估
 * - 评分系统：提供标准化的评分和质量等级划分
 * - 报告生成：生成详细的质量评估报告</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditQualityAssessment {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 评估名称
     *
     * <p>质量评估的名称，用于标识和显示。
     * 应该简洁明了地描述评估的主要内容和目的。</p>
     */
    @Column(name = "assessment_name", nullable = false, length = 200)
    private String assessmentName;

    /**
     * 评估类型
     *
     * <p>质量评估的类型标识，用于区分不同类型的评估。
     * 支持的类型包括：MANUAL（人工评估）、AUTO（自动评估）、HYBRID（混合评估）等。</p>
     */
    @Column(name = "assessment_type", nullable = false, length = 20)
    private String assessmentType;

    /**
     * 试卷ID
     *
     * <p>评估的试卷ID，关联papers表。
     * 用于标识评估的具体对象。</p>
     */
    @Column(name = "paper_id", nullable = false)
    private Long paperId;

    /**
     * 指标系统ID
     *
     * <p>使用的质量指标系统ID，关联quality_metric表。
     * 用于标识评估所依据的指标体系。</p>
     */
    @Column(name = "metric_system_id")
    private Long metricSystemId;

    /**
     * 评估人ID
     *
     * <p>执行质量评估的用户ID，关联系统用户表。
     * 用于记录评估的执行责任人。</p>
     */
    @Column(name = "assessor_id", nullable = false)
    private Long assessorId;

    /**
     * 评估人姓名
     *
     * <p>执行质量评估的用户姓名，用于显示和记录。
     * 冗余存储用户姓名，避免频繁关联查询用户表。</p>
     */
    @Column(name = "assessor_name", nullable = false, length = 100)
    private String assessorName;

    /**
     * 评估日期
     *
     * <p>执行质量评估的日期。
     * 用于评估的时间管理和统计分析。</p>
     */
    @Column(name = "assessment_date", nullable = false)
    private LocalDateTime assessmentDate;

    /**
     * 状态
     *
     * <p>质量评估的状态标识。
     * 支持的状态包括：IN_PROGRESS（进行中）、COMPLETED（已完成）、FAILED（失败）、CANCELLED（已取消）等。</p>
     */
    @Column(name = "status", nullable = false, length = 20)
    private String status = "IN_PROGRESS";

    /**
     * 总分
     *
     * <p>质量评估的总分数。
     * 基于各项指标的加权平均计算得出。</p>
     */
    @Column(name = "total_score", precision = 10, scale = 2)
    private BigDecimal totalScore;

    /**
     * 最高分
     *
     * <p>质量评估的最高可能分数。
     * 用于评分标准化和比较。</p>
     */
    @Column(name = "max_score", precision = 10, scale = 2)
    private BigDecimal maxScore;

    /**
     * 质量等级
     *
     * <p>基于总分确定的质量等级。
     * 支持的等级包括：EXCELLENT（优秀）、GOOD（良好）、FAIR（一般）、POOR（较差）等。</p>
     */
    @Column(name = "quality_grade", length = 10)
    private String qualityGrade;

    /**
     * 及格阈值
     *
     * <p>质量评估的及格分数线，百分比形式。
     * 默认值为60%，可根据需要调整。</p>
     */
    @Column(name = "pass_threshold", precision = 5, scale = 2)
    private BigDecimal passThreshold = BigDecimal.valueOf(60.0);

    /**
     * 评估摘要
     *
     * <p>质量评估结果的摘要信息。
     * 记录主要发现、问题和建议。</p>
     */
    @Column(name = "assessment_summary", columnDefinition = "TEXT")
    private String assessmentSummary;

    /**
     * 评估报告
     *
     * <p>详细的质量评估报告。
     * 包含完整的评估过程、结果分析和改进建议。</p>
     */
    @Column(name = "assessment_report", columnDefinition = "TEXT")
    private String assessmentReport;

    /**
     * 开始时间
     *
     * <p>评估开始执行的时间。</p>
     */
    @Column(name = "start_time", nullable = false)
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>评估完成的时间。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 持续时间（分钟）
     *
     * <p>评估执行的持续时间，单位为分钟。
     * 用于性能分析和工作量统计。</p>
     */
    @Column(name = "duration_minutes")
    private Integer durationMinutes;

    /**
     * 重试次数
     *
     * <p>评估失败后的重试次数。
     * 用于错误恢复和流程管理。</p>
     */
    @Column(name = "retry_count")
    private Integer retryCount = 0;

    /**
     * 评估配置
     *
     * <p>JSON格式的评估配置参数。
     * 包含评估的具体配置、权重设置、评分标准等。</p>
     */
    @Column(name = "assessment_config", columnDefinition = "TEXT")
    private String assessmentConfig;

    /**
     * 上下文数据
     *
     * <p>JSON格式的评估上下文数据。
     * 包含评估时的环境信息、相关参数等。</p>
     */
    @Column(name = "context_data", columnDefinition = "TEXT")
    private String contextData;

    /**
     * 结果数据
     *
     * <p>JSON格式的详细评估结果数据。
     * 包含各项指标的具体得分、详细分析等。</p>
     */
    @Column(name = "result_data", columnDefinition = "TEXT")
    private String resultData;

    /**
     * 是否删除
     *
     * <p>软删除标记，标识记录是否已删除。
     * true表示已删除，false表示未删除。</p>
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    // ===== 常量定义 =====

    // 评估类型常量
    /** 评估类型 - 人工评估 */
    public static final String TYPE_MANUAL = "MANUAL";

    /** 评估类型 - 自动评估 */
    public static final String TYPE_AUTO = "AUTO";

    /** 评估类型 - 混合评估 */
    public static final String TYPE_HYBRID = "HYBRID";

    /** 评估类型 - 抽样评估 */
    public static final String TYPE_SAMPLE = "SAMPLE";

    /** 评估类型 - 全面评估 */
    public static final String TYPE_COMPREHENSIVE = "COMPREHENSIVE";

    // 状态常量
    /** 状态 - 进行中 */
    public static final String STATUS_IN_PROGRESS = "IN_PROGRESS";

    /** 状态 - 已完成 */
    public static final String STATUS_COMPLETED = "COMPLETED";

    /** 状态 - 失败 */
    public static final String STATUS_FAILED = "FAILED";

    /** 状态 - 已取消 */
    public static final String STATUS_CANCELLED = "CANCELLED";

    // 质量等级常量
    /** 质量等级 - 优秀 */
    public static final String GRADE_EXCELLENT = "EXCELLENT";

    /** 质量等级 - 良好 */
    public static final String GRADE_GOOD = "GOOD";

    /** 质量等级 - 一般 */
    public static final String GRADE_FAIR = "FAIR";

    /** 质量等级 - 较差 */
    public static final String GRADE_POOR = "POOR";

    // 默认阈值常量
    /** 默认最高分 */
    public static final BigDecimal DEFAULT_MAX_SCORE = BigDecimal.valueOf(100.0);

    /** 优秀等级阈值 */
    public static final BigDecimal EXCELLENT_THRESHOLD = BigDecimal.valueOf(90.0);

    /** 良好等级阈值 */
    public static final BigDecimal GOOD_THRESHOLD = BigDecimal.valueOf(80.0);

    /** 一般等级阈值 */
    public static final BigDecimal FAIR_THRESHOLD = BigDecimal.valueOf(70.0);

}